node.jsのセッション管理にAmazon DynamoDBを使う
node.jsのセッション管理は?
node.jsにセッション管理の仕組みは備わっていません。なぜならば、node.jsが持っているhttp機能はベーシックなステートレスのみだからです。では、ステートフル(状態を保持する)な仕組みは無いのか?。実はモジュールという形で追加することで実現できます。今回は、node.jsのセッション管理の仕組みとして、Expressフレームワークを使います。このフレームワークの中にConnectというミドルウェアが統合されていて、セッション管理を行ってくれます。また、このセッション管理はデフォルトでメモリ上での管理(セッションストア)を行っていますが、Redis等を指定することも可能です。今回は、このセッションストアの部分をDynamoDBにしたいと思います。node.jsからDynamoDBに接続するライブラリはdynodeです。
環境のセットアップ
npmを使えば簡単♪
$ npm install dynode $ npm install express $ npm install connect $ npm install connect-dynamodb
DynamoDB session store for Connect
connect-dynamodbは、node.jsでセッション管理を行うためのミドルウェアであるConnectのセッションストア実装です。つい最近公開されたばかりのできたてホヤホヤのオープンソースです。ついでにバグがあったのでパッチを投稿しておきました。まずはソースを修正しましょう。
$ vi node_modules/connect-dynamodb/lib/connect-dynamodb.js
セッション利用のサンプルアプリ作成
node.js + Express + connect-dynamodb + dynode + DynamoDB を使ったセッション管理アプリを作ってみます。
$ vi app.js
var dynode = require('dynode'); var express = require('express'); var connect = require('connect'); var DynamoDBStore = require('connect-dynamodb')(connect); var assert = require('assert'); var client = new (dynode.Client)({ accessKeyId:'XXXXXXXXXXXXXXXXXXXXX', secretAccessKey:'XXXXXXXXXXXXXXXXXXXXX', host:'dynamodb.ap-northeast-1.amazonaws.com' }); var store = new DynamoDBStore({ client:client }); var app = express.createServer( express.cookieParser(), express.session({ secret:'satoshi-secret-key', store:store, cookie:{httpOnly:false, maxAge: 7 * 24 * 60 * 60 * 1000} }) ); app.get('/', function(req, res){ res.send('foo = ' + req.session.foo + ', hoge = ' +req.session.hoge); }); app.get('/set', function(req, res) { req.session.foo = 'bar'; req.session.hoge = 'hogehoge'; res.send('set: foo,hoge'); }); app.get('/del', function(req, res) { delete req.session.foo; }); app.listen(3000);
$ node app.js
動作確認
実際にDynamoDBをセッション管理に使うか動作確認してみましょう。nodeを起動すると、まず始めにセッション用のテーブルを作成します。
次にブラウザからアクセスをしてセッションに値をセットします。
DynamoDBにセッション情報が格納されているか管理コンソールから確認をします。
JSON形式で保存されていることが分かりますね。また、クライアントを識別するIDはconnect.sidという名前でCookieに入っています。
まとめ
node.jsのモジュールやミドルウェアを活用することで、セッション情報を永続化することができました。CookieのIDを識別子に使っていますので、複数サーバに負荷分散したとしても同じセッション情報を使えます。DynamoDBの特性はメンテナンスフリーで高可用性で高速I/Oですので、セッション情報の永続化先にもってこいです。今日から君もステートレスサーバーな生活を手に入れよう!